package com.itdianzi.controller.cargo;


import com.alibaba.dubbo.config.annotation.Reference;

import com.itdianzi.controller.base.BaseController;
import com.itdianzi.domain.cargo.Packing;
import com.itdianzi.domain.export.Export;
import com.itdianzi.export_common.common.utils.DownloadUtil;
import com.itdianzi.service.cargo.ContractService;
import com.itdianzi.service.cargo.ExportService;
import com.itdianzi.service.cargo.PackingService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.swing.text.Style;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

//下载出货表
@Controller
@RequestMapping("/cargo/packing")
public class PackingPrintController extends BaseController {

    @Reference
    private ContractService contractService;

    @Reference
    private PackingService packingService;

    @Reference
    private ExportService exportservice;

//    跳向出货表的界面
    @RequestMapping("/print")
    public String print(){

        return "cargo/print/contract-print";
    }

    /*
         客户 contract表
        订单号 contract表
        货号      contractProduct表
    	数量         contractProduct表
    	工厂      contractProduct表
    	工厂交期    contract表
    	船期  contract表
    		贸易条款  contract表
        这个是下载的模板中的标题的名字 ，里面包含了两个表，其中的八个字段信息 ，需要两个表联查
        但是保存需要单独在创建一个对象来接收里面的数据了
     */
//    这个使用模板的方式进行 写表格 已有一个表格里面有样式  先把这个表格读出来 赋值进去 生成另一个表格输出
    @RequestMapping("/printExcel")
    public void printExcel(String id) throws IOException {
        Packing packing = packingService.findById(id);
//        通过上下文对象 获取WEB——Inf下的文件 返回的是一个输入流
//        通过session先获取上问对象 然后打点getResourceAsStream 返回一个输入流
        InputStream is = session.getServletContext().getResourceAsStream("/make/xlsprint/tOUTPRODUCTaa.xlsx");
//        把这个输入流给工作簿对象 就可以获取这个excel表格
        Workbook wb= new XSSFWorkbook(is);
//        获取第一页对象
        Sheet sheet = wb.getSheetAt(0);
//        通过对一页对象获取第一行
        Row row = sheet.getRow(0);
//        获取第一行中的单元格，直接给这个单元格的里面赋值
        Cell cell = row.getCell(1);
//        inputDate 参数中的类型是 2015-01 下面是把-换成年 动态生成标题信息  inputDate.replaceAll string中的方法
//         inputDate=inputDate.replaceAll("-","年");
//         动态拼接日期
        cell.setCellValue("装箱表");

//      设置小标题 显示获取第一行 获取每一个单元格再放进去数据
        String [] params={"","卖方","买方","发票号","发票日期","唛头","描述","装箱港","目的港"};
        Row row1 = sheet.getRow(1);
        for (int i = 1; i < params.length; i++) {
//           通过行对象循环获取  从第二个单元格开始获取 因为第一个单元格是空的 会报空指针
            Cell cell1 = row1.getCell(i);
//          直接会给每一个单元格去赋值 即可
            cell1.setCellValue(params[i]);
        }
//        下面就是设置内容 从第三行开始 以为行数非常多 我么直接获取第三行每一个单元格的格式 在后面使用
        Row row3 = sheet.getRow(2);
//        创建一个单元格格式数组 第一个是空的也写到里面 方便便利 但是不去遍历 第一个是空获取对象会报空指针 直接从第二个开始遍历就好了
        CellStyle []style= new CellStyle[10];
        for (int i = 1; i < style.length; i++) {
//            循环获取第三行每一个单元格的格式  存到数组中去  在下面遍历赋值的时候直接给赋值进去
           style[i] = row3.getCell(i).getCellStyle();
        }
//        先定义变量方便使用
        Cell cell1=null;
//        使用simpleDateformat 把date类型转成string类型 写到表格中去 我这个不转就会变成毫秒值
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd");

//        设置内容

//            从第三行开始 也就是索引2
            Row row2 = sheet.createRow(2);
//            开始每一行的第一个单元格开始创建 我这里直接就创建了 因为我已经有单元格的样式了
             cell1 = row2.createCell(1);
//             给单元格的里面赋值 根据每行行内容选择 从对象中获取哪个字段的值
            cell1.setCellValue(packing.getSeller());
//            给单元格设置我们在数组中已经保存好的格式
            cell1.setCellStyle(style[1]);

            cell1 = row2.createCell(2);
            cell1.setCellValue(packing.getBuyer());
            cell1.setCellStyle(style[2]);

            cell1 = row2.createCell(3);
            cell1.setCellValue(packing.getInvoiceNo());
            cell1.setCellStyle(style[3]);

            cell1= row2.createCell(4);
            cell1.setCellValue(packing.getInvoiceDate());
            cell1.setCellStyle(style[4]);

            cell1 = row2.createCell(5);
            cell1.setCellValue(packing.getMarks());
            cell1.setCellStyle(style[5]);

            cell1 = row2.createCell(6);
            cell1.setCellValue(packing.getDescriptions());
            cell1.setCellStyle(style[6]);

            cell1 = row2.createCell(7);
            cell1.setCellValue(packing.getShipmentPort());
            cell1.setCellStyle(style[7]);

            cell1 = row2.createCell(8);
            cell1.setCellValue(packing.getDestinationPort());
            cell1.setCellStyle(style[8]);


        String exportIds = packing.getExportIds();
        String[] exportId = exportIds.split(",");
        List<Export> exportList=new ArrayList<>();
        for (String ids : exportId) {
            Export export = exportservice.findById(ids);
            exportList.add(export);
        }

//            获取第四行
        Row row5 = sheet.createRow(5);
        CellStyle s=  row.getCell(1).getCellStyle();
        Cell cell2 = row5.createCell(1);
        cell2.setCellValue("装箱单包含报运单内容");
        cell2.setCellStyle(s);
        String [] args={"","报运号","货物数量","附件数量","收货地址","装运港","目的港","运输方式","总箱数"};
//        获取第六行去放报运单的头
        Row row6 = sheet.getRow(6);

        for (int i = 1; i < args.length; i++) {
//           通过行对象循环获取  从第二个单元格开始获取 因为第一个单元格是空的 会报空指针
            Cell cell6 = row6.getCell(i);
//          直接会给每一个单元格去赋值 即可
            cell6.setCellValue(args[i]);
        }


        Cell cell3=null;
        for (int i = 0; i < exportList.size(); i++) {
            Row row7 = sheet.createRow(i+7);
            if (exportList.get(i).getId()!=null) {
                cell3 = row7.createCell(1);
                cell3.setCellValue(exportList.get(i).getId());
                cell3.setCellStyle(style[1]);
            }
            cell3 = row7.createCell(2);
            cell3.setCellValue(exportList.get(i).getProNum());
            cell3.setCellStyle(style[2]);

            cell3 = row7.createCell(3);
            cell3.setCellValue(exportList.get(i).getExtNum());
            cell3.setCellStyle(style[3]);

            cell3= row7.createCell(4);
            cell3.setCellValue(exportList.get(i).getConsignee());
            cell3.setCellStyle(style[4]);

            cell3 = row7.createCell(5);
            cell3.setCellValue(exportList.get(i).getShipmentPort());
            cell3.setCellStyle(style[5]);

            cell3 = row7.createCell(6);
            cell3.setCellValue(exportList.get(i).getDestinationPort());
            cell3.setCellStyle(style[6]);

            cell3 = row7.createCell(7);
            cell3.setCellValue(exportList.get(i).getTransportMode());
            cell3.setCellStyle(style[7]);

            cell3 = row7.createCell(8);
            cell3.setCellValue(exportList.get(i).getBoxNums());
            cell3.setCellStyle(style[8]);
        }


//        调用文件下载的工具类 使用工具类 进行文件的传输
        DownloadUtil downloadUtil = new DownloadUtil();
//        工具类的方法需要一个输出流 创建一个输出流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//      把工作簿对向写入到输出流
        wb.write(byteArrayOutputStream);
//        直接调用方法对文件进行输出，需要三个参数 输出流 response 起一个下载的名字
        downloadUtil.download(byteArrayOutputStream,response,"装箱单.xlsx");
    }



}
